package serie07;

import java.util.Observable;

public class StdSuspenseModel extends Observable implements SuspenseModel {
									
	// ATTRIBUTS
	
	// Nombre de coups
	private int drawsNumber;
	
	// Valeur maximale qu'un joueur puisse proposer.
	private int maxNumber;
	
	// Nombre aleatoire.
	private int number;
	
	// Indique si la derniere proposition est perdante ou non.
	private boolean hasLost;
	
	// CONSTRUCTEUR
	
	public StdSuspenseModel(int max) {
		if (max <= 0) {
			throw new IllegalArgumentException("Valeur negative");
		}
		drawsNumber = 0;
		maxNumber = max; 
		hasLost = false;
		setChanged();
	}
	// REQUETES
    
    public int getDrawsNumber() {
    	return drawsNumber;
    }
    
    public int getMaxNumber() {
    	return maxNumber;
    }
    
    public int getNumber() {
    	if (getDrawsNumber() <= 0) {
    		throw new IllegalStateException();
    	}
    	return number;
    }
    
    public boolean hasLost() {
    	return hasLost;
    }
    
    // COMMANDES
    
    public void drawNumber(int proposal) {
    	if (1 > proposal || proposal > getMaxNumber()) {
    		throw new IllegalArgumentException();
    	}
    	if (hasLost()) {
    		throw new IllegalStateException();
    	}
    	drawsNumber += 1;
    	number = (int) (Math.random() * getMaxNumber() + 1);
    	hasLost = (proposal == getNumber());
    	setChanged();
        notifyObservers();
    }
    
    public void reinit() {
    	if (!hasLost()) {
    		throw new IllegalStateException();
    	}
    	drawsNumber = 0;
    	hasLost = false;
    	setChanged();
        notifyObservers();
    }

}
